home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 328 / v_m_ops.inc < prev   
Text File  |  1988-10-29  |  68KB  |  2,115 lines

  1.  
  2. /***************************************************************************
  3.  
  4.    V_M_OPS.INC
  5.  
  6.    All 6502 simulation code is in this file
  7.  
  8.    December 31, 1986  0:00
  9.  
  10.  ***************************************************************************/
  11.  
  12.  
  13. /* format of the mnemonics: 3 ascii codes of th opcode and the addressing mode:
  14.    00 - implied     01 - immediate     02 - zero page         03 - zero page,x
  15.    04 - zero page,y 05 - (zero page,x) 06 - (zero page),y
  16.    07 - absolute    08 - absolute,x    09 - absolute,y        0A - accumulator
  17.    0B - relative    0C - indirect      0D - absolute indirect
  18. */
  19.  
  20. long mnemonics[256] = {
  21.  
  22.  0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L,
  23.  0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L,
  24.  0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L,
  25.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L,
  26.  0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L,
  27.  0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L,
  28.  0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L,
  29.  0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L,
  30.  0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L,
  31.  0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L,
  32.  0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L,
  33.  0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L,
  34.  0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L,
  35.  0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L,
  36.  0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L,
  37.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L,
  38.  0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L,
  39.  0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L,
  40.  0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L,
  41.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L,
  42.  0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L,
  43.  0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L,
  44.  0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L,
  45.  0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L,
  46.  0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L,
  47.  0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L,
  48.  0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L,
  49.  0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L,
  50.  0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L,
  51.  0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L,
  52.  0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L,
  53.  0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L,
  54.  0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L,
  55.  0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L,
  56.  0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L,
  57.  0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L,
  58.  0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L,
  59.  0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L,
  60.  0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L,
  61.  0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L,
  62.  0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L,
  63.  0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L,
  64.  0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L
  65.  } ;
  66.  
  67.  
  68.   /* tell Megamax that the emulation routines will be found in inline code: */
  69.  
  70. extern
  71.  op00(), op01(), op02(), op03(), op04(), op05(), op06(), op07(), op08(),
  72.  op09(),op0A(),op0B(), op0C(), op0D(), op0E(), op0F(), op10(), op11(), op12(),
  73.  op13(), op14(), op15(), op16(), op17(), op18(), op19(), op1A(), op1B(),
  74.  op1C(), op1D(), op1E(), op1F(), op20(), op21(), op22(), op23(), op24(),
  75.  op25(), op26(), op27(), op28(), op29(), op2A(), op2B(), op2C(), op2D(),
  76.  op2E(), op2F(), op30(), op31(), op32(), op33(), op34(), op35(), op36(),
  77.  op37(), op38(), op39(), op3A(), op3B(), op3C(), op3D(), op3E(), op3F(),
  78.  op40(), op41(), op42(), op43(), op44(), op45(), op46(), op47(), op48(),
  79.  op49(), op4A(), op4B(), op4C(), op4D(), op4E(), op4F(), op50(), op51(),
  80.  op52(), op53(), op54(), op55(), op56(), op57(), op58(), op59(), op5A(),
  81.  op5B(), op5C(), op5D(), op5E(), op5F(), op60(), op61(), op62(), op63(),
  82.  op64(), op65(), op66(), op67(), op68(), op69(), op6A(), op6B(), op6C(),
  83.  op6D(), op6E(), op6F(), op70(), op71(), op72(), op73(), op74(), op75(),
  84.  op76(), op77(), op78(), op79(), op7A(), op7B(), op7C(), op7D(), op7E(),
  85.  op7F(), op80(), op81(), op82(), op83(), op84(), op85(), op86(), op87(),
  86.  op88(), op89(), op8A(), op8B(), op8C(), op8D(), op8E(), op8F(), op90(),
  87.  op91(), op92(), op93(), op94(), op95(), op96(), op97(), op98(), op99(),
  88.  op9A(), op9B(), op9C(), op9D(), op9E(), op9F(), opA0(), opA1(), opA2(),
  89.  opA3(), opA4(), opA5(), opA6(), opA7(), opA8(), opA9(), opAA(), opAB(),
  90.  opAC(), opAD(), opAE(), opAF(), opB0(), opB1(), opB2(), opB3(), opB4(),
  91.  opB5(), opB6(), opB7(), opB8(), opB9(), opBA(), opBB(), opBC(), opBD(),
  92.  opBE(), opBF(), opC0(), opC1(), opC2(), opC3(), opC4(), opC5(), opC6(),
  93.  opC7(), opC8(), opC9(), opCA(), opCB(), opCC(), opCD(), opCE(), opCF(),
  94.  opD0(), opD1(), opD2(), opD3(), opD4(), opD5(), opD6(), opD7(), opD8(),
  95.  opD9(), opDA(), opDB(), opDC(), opDD(), opDE(), opDF(), opE0(), opE1(),
  96.  opE2(), opE3(), opE4(), opE5(), opE6(), opE7(), opE8(), opE9(), opEA(),
  97.  opEB(), opEC(), opED(), opEE(), opEF(), opF0(), opF1(), opF2(), opF3(),
  98.  opF4(), opF5(), opF6(), opF7(), opF8(), opF9(), opFA(), opFB(), opFC(),
  99.  opFD(), opFE(), opFF() ;
  100.  
  101.  
  102. int (*vec_6502[256])() = {  /* create an array of pointers to 256 functions */
  103.  
  104.  op00, op01, op02, op03, op04, op05, op06, op07, op08,
  105.  op09, op0A, op0B, op0C, op0D, op0E, op0F, op10, op11, op12,
  106.  op13, op14, op15, op16, op17, op18, op19, op1A, op1B,
  107.  op1C, op1D, op1E, op1F, op20, op21, op22, op23, op24,
  108.  op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D,
  109.  op2E, op2F, op30, op31, op32, op33, op34, op35, op36,
  110.  op37, op38, op39, op3A, op3B, op3C, op3D, op3E, op3F,
  111.  op40, op41, op42, op43, op44, op45, op46, op47, op48,
  112.  op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51,
  113.  op52, op53, op54, op55, op56, op57, op58, op59, op5A,
  114.  op5B, op5C, op5D, op5E, op5F, op60, op61, op62, op63,
  115.  op64, op65, op66, op67, op68, op69, op6A, op6B, op6C,
  116.  op6D, op6E, op6F, op70, op71, op72, op73, op74, op75,
  117.  op76, op77, op78, op79, op7A, op7B, op7C, op7D, op7E,
  118.  op7F, op80, op81, op82, op83, op84, op85, op86, op87,
  119.  op88, op89, op8A, op8B, op8C, op8D, op8E, op8F, op90,
  120.  op91, op92, op93, op94, op95, op96, op97, op98, op99,
  121.  op9A, op9B, op9C, op9D, op9E, op9F, opA0, opA1, opA2,
  122.  opA3, opA4, opA5, opA6, opA7, opA8, opA9, opAA, opAB,
  123.  opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3, opB4,
  124.  opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD,
  125.  opBE, opBF, opC0, opC1, opC2, opC3, opC4, opC5, opC6,
  126.  opC7, opC8, opC9, opCA, opCB, opCC, opCD, opCE, opCF,
  127.  opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7, opD8,
  128.  opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1,
  129.  opE2, opE3, opE4, opE5, opE6, opE7, opE8, opE9, opEA,
  130.  opEB, opEC, opED, opEE, opEF, opF0, opF1, opF2, opF3,
  131.  opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB, opFC,
  132.  opFD, opFE, opFF } ;
  133.  
  134.  
  135. execute() {
  136.  
  137.     asm {
  138.         MOVEM.L D0-D7/A0-A3/A5,-(SP)    /* save enviornment */
  139.  
  140.         CLR.L   D0          /* clear everything just to be safe */
  141.         CLR.L   D1
  142.         CLR.L   D2
  143.         CLR.L   D3
  144.         CLR.L   D4
  145.         CLR.L   D5
  146.         CLR.L   D6
  147.         CLR.L   D7
  148.                                  /* convert   P register NV_BDIZC
  149.                                          to CCR register BDIXNZVC */
  150.         MOVE.B  p(GLOBAL),REGST
  151.         MOVE.B  REGST,DBUS       /* BDI */
  152.         MOVE.B  REGST,REGA       /* N */
  153.         MOVE.B  REGST,REGX       /* V */
  154.         MOVE.B  REGST,REGY       /* Z */
  155.         MOVE.B  REGST,REGEA      /* set X equal to C */
  156.  
  157.         ASL.B   #3,DBUS
  158.         AND.B   #0xE0,DBUS       /* BDI_____ */
  159.         ASL.B   #4,REGEA
  160.         AND.B   #BITX,REGEA      /* ___X____ */
  161.         ASL.B   #1,REGY
  162.         AND.B   #BITZ,REGY       /* _____Z__ */
  163.         ASR.B   #4,REGA
  164.         AND.B   #BITN,REGA       /* ____N___ */
  165.         ASR.B   #5,REGX
  166.         AND.B   #BITV,REGX       /* ______V_ */
  167.  
  168.         MOVE.B  REGEA,REGST
  169.         OR.B    REGX,REGST
  170.         OR.B    REGY,REGST
  171.         OR.B    REGA,REGST
  172.         OR.B    DBUS,REGST       /* that gets BDIXNZVC !!! */
  173.  
  174.         MOVE.B  a(GLOBAL),REGA      /* load 6502 registers */
  175.         MOVE.B  x(GLOBAL),REGX
  176.         MOVE.B  y(GLOBAL),REGY
  177.         MOVE.W  #0x100,REGSP
  178.         MOVE.B  sp(GLOBAL),REGSP    /* stack is on page 1 */
  179.         MOVE.W  pc(GLOBAL),REGPC
  180.  
  181.         LEA     exit_emul,REGEMUL
  182.         MOVE.L  REGEMUL,exitptr(GLOBAL) /* pointer to exit_emul */
  183.         LEA     emul,REGEMUL        /* pointer to emulator */
  184.         TST.B   trace(GLOBAL)
  185.         BEQ     notrace             /* if trace bit set... */
  186.         LEA     exit_emul,REGEMUL   /* divert to exit routine */
  187.   notrace:
  188.         LEA     vec_6502(GLOBAL),REGOPS     /* pointer to table */
  189.         MOVE.L  mem(GLOBAL),REGMEA  /* pointer to mem[ea] */
  190.         MOVE.L  stat(GLOBAL),REGSTAT
  191.         MOVE.L  REGMEA,REGEA
  192.         ADD.L   REGMEA,REGPC        /* pointer to mem[pc] */
  193.         MOVE.L  REGPC,REGMPC
  194.  
  195.       }                             /* fall through into emulator */
  196.  
  197.   emul:
  198.  
  199.      asm {
  200.         CLR.W   IR                     /* 4 clock cycles */
  201.         MOVE.B  (REGMPC)+,IR           /* 8 clock cycles */
  202.         ADD.W   IR,IR                  /* 4 clock cycles */
  203.         ADD.W   IR,IR                  /* 4 clock cycles */
  204.         MOVE.L  0(REGOPS,IR.W),REGMEA  /* 15-20 clock cycles */
  205.         JMP     (REGMEA)               /* 8 clock cycles */
  206.       }
  207.  
  208.   exit_emul:
  209.  
  210.     asm {
  211.  
  212.         MOVE.B  REGA,a(GLOBAL)      /* save 6502 registers */
  213.         MOVE.B  REGX,x(GLOBAL)
  214.         MOVE.B  REGY,y(GLOBAL)
  215.         MOVE.B  REGSP,sp(GLOBAL)
  216.         MOVE.W  REGMPC,pc(GLOBAL)
  217.         MOVE.W  REGMEA,ea(GLOBAL)
  218.  
  219.                                  /* convert CCR register BDIXNZVC
  220.                                          to  P  register NV_BDIZC */
  221.         MOVE.B  REGST,DBUS       /* BDI */
  222.         MOVE.B  REGST,REGA       /* N */
  223.         MOVE.B  REGST,REGX       /* V */
  224.         MOVE.B  REGST,REGY       /* Z */
  225.         MOVE.B  REGST,REGEA      /* C */
  226.  
  227.         ASR.B   #3,DBUS
  228.         AND.B   #0x1C,DBUS       /* ___BDI__ */
  229.         ASR.B   #4,REGEA
  230.         AND.B   #CBIT,REGEA      /* _______C */
  231.         ASR.B   #1,REGY
  232.         AND.B   #ZBIT,REGY       /* ______Z_ */
  233.         ASL.B   #4,REGA
  234.         AND.B   #NBIT,REGA       /* N_______ */
  235.         ASL.B   #5,REGX
  236.         AND.B   #VBIT,REGX       /* _V______ */
  237.  
  238.         MOVE.B  REGEA,REGST
  239.         OR.B    REGX,REGST
  240.         OR.B    REGY,REGST
  241.         OR.B    REGA,REGST
  242.         OR.B    DBUS,REGST       /* that gets NV_BDIZC !!! */
  243.  
  244.         MOVE.B  REGST,p(GLOBAL)
  245.  
  246.         MOVEM.L (SP)+,D0-D7/A0-A3/A5   /* restore enviornment */
  247.       }
  248.     return(0) ;                        /* and get outta here! */
  249.  
  250.  
  251.   asm {                       /* 256 emulation routines go here */
  252.                               /* but first, some common code: */
  253.  
  254.           /* at entry, all common routines have REGEA loaded */
  255.   doOR:
  256.         MOVE.B  0(REGSTAT,REGEA.W),IR     /* get status byte */
  257.         BPL     ORread                    /* if OK to read memory do so */
  258.         SETREAD                           /* else set read flag */
  259.         BSR     emul_serv                 /*  and call service routine */
  260.   ORread:
  261.         MOVE.L  REGEA,REGMEA
  262.         OR.B    (REGMEA),REGA
  263.         MOVE.W  SR,DBUS
  264.         AND.B   #(BITN|BITZ),DBUS
  265.         AND.B   #~(BITN|BITZ),REGST
  266.         OR.B    DBUS,REGST
  267.         JMP     (REGEMUL)
  268.  
  269.   doAND:                                  /* ditto */
  270.         MOVE.B  0(REGSTAT,REGEA.W),IR
  271.         BPL     ANDread
  272.         SETREAD
  273.         BSR     emul_serv
  274.   ANDread:
  275.         MOVE.L  REGEA,REGMEA
  276.         AND.B   (REGMEA),REGA
  277.         MOVE.W  SR,DBUS
  278.         AND.B   #(BITN|BITZ),DBUS
  279.         AND.B   #~(BITN|BITZ),REGST
  280.         OR.B    DBUS,REGST
  281.         JMP     (REGEMUL)
  282.  
  283.   doEOR:
  284.         MOVE.B  0(REGSTAT,REGEA.W),IR
  285.         BPL     EORread
  286.         SETREAD
  287.         BSR     emul_serv
  288.   EORread:
  289.         MOVE.L  REGEA,REGMEA
  290.         MOVE.B  (REGMEA),DBUS    /* stupid 68000 limitation */
  291.         EOR.B   DBUS,REGA        /* makes you do it in 2 steps */
  292.         MOVE.W  SR,DBUS          /* argghhhhh!!! */
  293.         AND.B   #(BITN|BITZ),DBUS
  294.         AND.B   #~(BITN|BITZ),REGST
  295.         OR.B    DBUS,REGST
  296.         JMP     (REGEMUL)
  297.  
  298.   doINC:
  299.         MOVE.L  REGEA,REGMEA
  300.         ADDQ.B  #1,(REGMEA)
  301.         MOVE.W  SR,DBUS
  302.         AND.B   #(BITN|BITZ),DBUS
  303.         AND.B   #~(BITN|BITZ),REGST
  304.         OR.B    DBUS,REGST
  305.         JMP     (REGEMUL)
  306.  
  307.   doDEC:
  308.         MOVE.L  REGEA,REGMEA
  309.         SUBQ.B  #1,(REGMEA)
  310.         MOVE.W  SR,DBUS
  311.         AND.B   #(BITN|BITZ),DBUS
  312.         AND.B   #~(BITN|BITZ),REGST
  313.         OR.B    DBUS,REGST
  314.         JMP     (REGEMUL)
  315.  
  316.   doLDA:
  317.         MOVE.B  0(REGSTAT,REGEA.W),IR
  318.         BPL     LDAread
  319.         SETREAD
  320.         BSR     emul_serv
  321.   LDAread:
  322.         MOVE.L  REGEA,REGMEA
  323.         MOVE.B  (REGMEA),REGA
  324.         MOVE.W  SR,DBUS
  325.         AND.B   #(BITN|BITZ),DBUS
  326.         AND.B   #~(BITN|BITZ),REGST
  327.         OR.B    DBUS,REGST
  328.         JMP     (REGEMUL)
  329.  
  330.   doLDX:
  331.         MOVE.B  0(REGSTAT,REGEA.W),IR
  332.         BPL     LDXread
  333.         SETREAD
  334.         BSR     emul_serv
  335.   LDXread:
  336.         MOVE.L  REGEA,REGMEA
  337.         MOVE.B  (REGMEA),REGX
  338.         MOVE.W  SR,DBUS
  339.         AND.B   #(BITN|BITZ),DBUS
  340.         AND.B   #~(BITN|BITZ),REGST
  341.         OR.B    DBUS,REGST
  342.         JMP     (REGEMUL)
  343.  
  344.   doLDY:
  345.         MOVE.B  0(REGSTAT,REGEA.W),IR
  346.         BPL     LDYread
  347.         SETREAD
  348.         BSR     emul_serv
  349.   LDYread:
  350.         MOVE.L  REGEA,REGMEA
  351.         MOVE.B  (REGMEA),REGY
  352.         MOVE.W  SR,DBUS
  353.         AND.B   #(BITN|BITZ),DBUS
  354.         AND.B   #~(BITN|BITZ),REGST
  355.         OR.B    DBUS,REGST
  356.         JMP     (REGEMUL)
  357.  
  358.   doSTA:
  359.         MOVE.B  0(REGSTAT,REGEA.W),IR
  360.         BEQ     STAwrite
  361.         SETWRITE
  362.         SWAP    DBUS
  363.         MOVE.B  REGA,DBUS
  364.         SWAP    DBUS
  365.         BRA     emul_serv
  366.   STAwrite:
  367.         MOVE.L  REGEA,REGMEA
  368.         MOVE.B  REGA,(REGMEA)
  369.         JMP     (REGEMUL)
  370.  
  371.   doSTX:
  372.         MOVE.B  0(REGSTAT,REGEA.W),IR
  373.         BEQ     STXwrite
  374.         SETWRITE
  375.         SWAP    DBUS
  376.         MOVE.B  REGX,DBUS
  377.         SWAP    DBUS
  378.         BRA     emul_serv
  379.   STXwrite:
  380.         MOVE.L  REGEA,REGMEA
  381.         MOVE.B  REGX,(REGMEA)
  382.         JMP     (REGEMUL)
  383.  
  384.   doSTY:
  385.         MOVE.B  0(REGSTAT,REGEA.W),IR
  386.         BEQ     STYwrite
  387.         SETWRITE
  388.         SWAP    DBUS
  389.         MOVE.B  REGY,DBUS
  390.         SWAP    DBUS
  391.         BRA     emul_serv
  392.   STYwrite:
  393.         MOVE.L  REGEA,REGMEA
  394.         MOVE.B  REGY,(REGMEA)
  395.         JMP     (REGEMUL)
  396.  
  397.   doADC:
  398.         MOVE.L  REGEA,REGMEA
  399.         MOVE.B  (REGMEA),DBUS
  400.         ORI.B   #BITZ,REGST          /* ADDX doesn't set Z flag */
  401.         MOVE.B  REGST,CCR            /*  so prepare C bit */
  402.         ADDX.B  DBUS,REGA            /* BUG!! BUG!! no decimal mode yet!! */
  403.         MOVE.W  SR,DBUS
  404.         AND.B   #(BITN|BITZ|BITV|BITX),DBUS
  405.         AND.B   #~(BITN|BITZ|BITV|BITX),REGST
  406.         OR.B    DBUS,REGST
  407.         JMP     (REGEMUL)
  408.  
  409.   doSBC:
  410.         MOVE.L  REGEA,REGMEA
  411.         MOVE.B  (REGMEA),DBUS
  412.         EORI.B  #BITX,REGST         /* different than 6502 */
  413.         ORI.B   #BITZ,REGST         /* SUBX doesn't set Z flag */
  414.         MOVE.B  REGST,CCR
  415.         SUBX.B  DBUS,REGA
  416.         MOVE.W  SR,DBUS
  417.         AND.B   #(BITN|BITZ|BITX|BITV),DBUS
  418.         EORI.B  #BITX,DBUS
  419.         AND.B   #~(BITN|BITZ|BITX|BITV),REGST
  420.         OR.B    DBUS,REGST
  421.         JMP     (REGEMUL)
  422.  
  423.  
  424.   doROL:
  425.         MOVE.L  REGEA,REGMEA
  426.         MOVE.B  (REGMEA),IR         /* get byte */
  427.         MOVE.B  REGST,CCR
  428.         ROXL.B  #1,IR               /* shift it */
  429.         MOVE.B  IR,(REGMEA)         /* save in memory */
  430.         MOVE.W  SR,DBUS
  431.         AND.B   #(BITN|BITZ|BITX),DBUS   /* update flags N Z C */
  432.         AND.B   #~(BITN|BITZ|BITX),REGST
  433.         OR.B    DBUS,REGST
  434.         JMP     (REGEMUL)
  435.  
  436.   doROR:
  437.         MOVE.L  REGEA,REGMEA
  438.         MOVE.B  (REGMEA),IR
  439.         MOVE.B  REGST,CCR
  440.         ROXR.B  #1,IR
  441.         MOVE.B  IR,(REGMEA)
  442.         MOVE.W  SR,DBUS
  443.         AND.B   #(BITN|BITZ|BITX),DBUS
  444.         AND.B   #~(BITN|BITZ|BITX),REGST
  445.         OR.B    DBUS,REGST
  446.         JMP     (REGEMUL)
  447.  
  448.   doASL:
  449.         MOVE.L  REGEA,REGMEA
  450.         MOVE.B  (REGMEA),IR
  451.         ASL.B   #1,IR
  452.         MOVE.B  IR,(REGMEA)
  453.         MOVE.W  SR,DBUS
  454.         AND.B   #(BITN|BITZ|BITX),DBUS
  455.         AND.B   #~(BITN|BITZ|BITX),REGST
  456.         OR.B    DBUS,REGST
  457.         JMP     (REGEMUL)
  458.  
  459.   doLSR:
  460.         MOVE.L  REGEA,REGMEA
  461.         MOVE.B  (REGMEA),IR
  462.         LSR.B   #1,IR
  463.         MOVE.B  IR,(REGMEA)
  464.         MOVE.W  SR,DBUS
  465.         AND.B   #(BITN|BITZ|BITX),DBUS
  466.         AND.B   #~(BITN|BITZ|BITX),REGST
  467.         OR.B    DBUS,REGST
  468.         JMP     (REGEMUL)
  469.  
  470.  
  471.          /* here are the actual 256 emulation routines: */
  472.  
  473.   op00: OR.B    #BITB,REGST
  474.         BRA     exit_emul
  475.  
  476.   op01: CLR.W   REGEA                     /* ORA (zp,X) */
  477.         MOVE.B  (REGMPC)+,REGEA    /* get zero page address */
  478.         ADD.B   REGX,REGEA         /* wraparound to zero page again */
  479.         MOVE.L  REGEA,REGMEA       /* effective address calculated */
  480.         MOVE.B  1(REGMEA),-(SP)    /* get hi byte */
  481.         MOVE.W  (SP)+,REGEA        /* and shift by 8 (neat huh?) */
  482.         MOVE.B  (REGMEA),REGEA     /* get lo byte */
  483.         BRA     doOR               /* go to common ORing routine */
  484.  
  485.   op02: JMP     (REGEMUL)
  486.  
  487.   op03: JMP     (REGEMUL)
  488.  
  489.   op04: JMP     (REGEMUL)
  490.  
  491.   op05: CLR.W   REGEA                     /* ORA zp */
  492.         MOVE.B  (REGMPC)+,REGEA    /* ditto */
  493.         BRA     ORread
  494.  
  495.   op06: CLR.W   REGEA                     /* ASL zp */
  496.         MOVE.B  (REGMPC)+,REGEA
  497.         BRA     doASL
  498.  
  499.   op07: JMP     (REGEMUL)
  500.  
  501.   op08:                            /* PHP */
  502.         MOVE.W  REGSP,REGEA
  503.         MOVE.L  REGEA,REGMEA
  504.         MOVEM.L DBUS/REGST/REGA/REGX/REGY/REGEA,-(SP)
  505.                                  /* convert CCR register BDIXNZVC
  506.                                          to  P  register NV_BDIZC */
  507.         MOVE.B  REGST,DBUS       /* BDI */
  508.         MOVE.B  REGST,REGA       /* N */
  509.         MOVE.B  REGST,REGX       /* V */
  510.         MOVE.B  REGST,REGY       /* Z */
  511.         MOVE.B  REGST,REGEA      /* C */
  512.         ASR.B   #3,DBUS
  513.         AND.B   #0x1C,DBUS       /* ___BDI__ */
  514.         ASR.B   #4,REGEA
  515.         AND.B   #CBIT,REGEA      /* _______C */
  516.         ASR.B   #1,REGY
  517.         AND.B   #ZBIT,REGY       /* ______Z_ */
  518.         ASL.B   #4,REGA
  519.         AND.B   #NBIT,REGA       /* N_______ */
  520.         ASL.B   #5,REGX
  521.         AND.B   #VBIT,REGX       /* _V______ */
  522.         MOVE.B  REGEA,REGST
  523.         OR.B    REGX,REGST
  524.         OR.B    REGY,REGST
  525.         OR.B    REGA,REGST
  526.         OR.B    DBUS,REGST       /* that gets NV_BDIZC !!! */
  527.         ORI.B   #0x20,REGST     /* and then  NV1BDIZC */
  528.         MOVE.B  REGST,(REGMEA)     /* push processor */
  529.         MOVEM.L (SP)+,DBUS/REGST/REGA/REGX/REGY/REGEA
  530.         SUBQ.B  #1,REGSP
  531.         JMP     (REGEMUL)
  532.  
  533.  
  534.   op09: OR.B    (REGMPC)+,REGA           /* ORA # */
  535.         MOVE.W  SR,DBUS
  536.         AND.B   #(BITN|BITZ),DBUS
  537.         AND.B   #~(BITN|BITZ),REGST
  538.         OR.B    DBUS,REGST
  539.         JMP     (REGEMUL)
  540.  
  541.   op0A:                                   /* ASL A */
  542.         ASL.B   #1,REGA                   /* shift it */
  543.         MOVE.W  SR,DBUS
  544.         AND.B   #(BITN|BITZ|BITX),DBUS   /* update flags N Z C */
  545.         AND.B   #~(BITN|BITZ|BITX),REGST
  546.         OR.B    DBUS,REGST
  547.         JMP     (REGEMUL)
  548.  
  549.   op0B: JMP     (REGEMUL)
  550.  
  551.   op0C: JMP     (REGEMUL)
  552.  
  553.   op0D:                                   /* ORA abs */
  554.         MOVE.B  1(REGMPC),-(SP)           /* get hi byte */
  555.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  556.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  557.         ADDQ.W  #2,REGMPC
  558.         BRA     doOR
  559.  
  560.   op0E:                                   /* ASL abs */
  561.         MOVE.B  1(REGMPC),-(SP)
  562.         MOVE.W  (SP)+,REGEA
  563.         MOVE.B  (REGMPC),REGEA
  564.         ADDQ.W  #2,REGMPC
  565.         BRA     doASL
  566.  
  567.   op0F: JMP     (REGEMUL)
  568.  
  569.   op10: BTST    #3,REGST     /* BPL */
  570.         BNE     nobpl        /* BITN = 0x08 = bit #3 */
  571.         MOVE.B  (REGMPC)+,DBUS
  572.         EXT.W   DBUS
  573.         ADDA.W  DBUS,REGMPC
  574.         JMP     (REGEMUL)
  575.     nobpl:
  576.         ADDQ.L  #1,REGMPC
  577.         JMP     (REGEMUL)
  578.  
  579.   op11: CLR.W   REGEA                     /* ORA (zp),Y */
  580.         MOVE.B  (REGMPC)+,REGEA
  581.         MOVE.L  REGEA,REGMEA
  582.         MOVE.B  1(REGMEA),-(SP)           /* get hi byte */
  583.         MOVE.W  (SP)+,REGEA               /* and shift by 8 */
  584.         MOVE.B  (REGMEA),REGEA            /* get lo byte */
  585.         ADD.W   REGY,REGEA
  586.         BRA     doOR
  587.  
  588.   op12: JMP     (REGEMUL)
  589.  
  590.   op13: JMP     (REGEMUL)
  591.  
  592.   op14: JMP     (REGEMUL)
  593.  
  594.   op15: CLR.W   REGEA                     /* ORA zp,X */
  595.         MOVE.B  (REGMPC)+,REGEA
  596.         ADD.B   REGX,REGEA                /* wraparpund */
  597.         BRA     ORread
  598.  
  599.   op16: CLR.W   REGEA                      /* ASL zp,X */
  600.         MOVE.B  (REGMPC)+,REGEA
  601.         ADD.B   REGX,REGEA
  602.         BRA     doASL
  603.  
  604.   op17: JMP     (REGEMUL)
  605.  
  606.   op18: ANDI.B  #~BITX,REGST      /* CLC */
  607.         JMP     (REGEMUL)
  608.  
  609.   op19:                                   /* ORA abs,Y */
  610.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  611.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  612.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  613.         ADD.W   REGY,REGEA
  614.         ADDQ.W  #2,REGMPC
  615.         BRA     doOR
  616.  
  617.   op1A: JMP     (REGEMUL)
  618.  
  619.   op1B: JMP     (REGEMUL)
  620.  
  621.   op1C: JMP     (REGEMUL)
  622.  
  623.   op1D:                                   /* ORA abs,X */
  624.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  625.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  626.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  627.         ADD.W   REGX,REGEA
  628.         ADDQ.W  #2,REGMPC
  629.         BRA     doOR
  630.  
  631.   op1E:                                /* ASL abs,X */
  632.         MOVE.B  1(REGMPC),-(SP)
  633.         MOVE.W  (SP)+,REGEA
  634.         MOVE.B  (REGMPC),REGEA
  635.         ADD.W   REGX,REGEA
  636.         ADDQ.W  #2,REGMPC
  637.         BRA     doASL
  638.  
  639.   op1F: JMP     (REGEMUL)
  640.  
  641.   op20: SUBQ.B  #2,REGSP            /* JSR abs */
  642.         MOVE.W  REGSP,REGEA
  643.         MOVE.L  REGEA,REGMEA
  644.         MOVE.W  REGMPC,REGPC
  645.         ADDQ.W  #1,REGPC
  646.         MOVE.B  REGPC,1(REGMEA)     /* push PClo */
  647.         MOVE.W  REGPC,-(SP)
  648.         MOVE.B  (SP)+,2(REGMEA)  /* push PChi */
  649.         MOVE.B  1(REGMPC),-(SP)
  650.         MOVE.W  (SP)+,REGPC
  651.         MOVE.B  (REGMPC),REGPC
  652.         MOVE.L  REGPC,REGMPC
  653.         JMP     (REGEMUL)
  654.  
  655.   op21: CLR.W   REGEA                     /* AND (zp,X) */
  656.         MOVE.B  (REGMPC)+,REGEA
  657.         ADD.B   REGX,REGEA
  658.         MOVE.L  REGEA,REGMEA
  659.         MOVE.B  1(REGMEA),-(SP)
  660.         MOVE.W  (SP)+,REGEA
  661.         MOVE.B  (REGMEA),REGEA
  662.         BRA     doAND
  663.  
  664.   op22: JMP     (REGEMUL)
  665.  
  666.   op23: JMP     (REGEMUL)
  667.  
  668.   op24: CLR.W   REGEA                     /* BIT zp */
  669.         MOVE.B  (REGMPC)+,REGEA
  670.         MOVE.L  REGEA,REGMEA
  671.         TST.B   (REGMEA)         /* V bit not set!!!! */
  672.         MOVE.W  SR,DBUS
  673.         AND.B   #(BITN|BITZ),DBUS
  674.         AND.B   #~(BITN|BITZ|BITV),REGST
  675.         OR.B    DBUS,REGST
  676.         MOVE.B  (REGMEA),DBUS
  677.         LSR.B   #5,DBUS            /* shift V bit into position */
  678.         AND.B   #(BITV),DBUS
  679.         OR.B    DBUS,REGST
  680.         JMP     (REGEMUL)
  681.  
  682.   op25: CLR.W   REGEA                     /* AND zp */
  683.         MOVE.B  (REGMPC)+,REGEA
  684.         BRA     ANDread
  685.  
  686.   op26: CLR.W   REGEA                     /* ROL zp */
  687.         MOVE.B  (REGMPC)+,REGEA
  688.         BRA     doROL
  689.  
  690.   op27: JMP     (REGEMUL)
  691.  
  692.   op28:                            /* PLP */
  693.         ADDQ.B  #1,REGSP
  694.         MOVE.W  REGSP,REGEA
  695.         MOVE.L  REGEA,REGMEA
  696.         MOVE.B  (REGMEA),REGST
  697.         MOVEM.L DBUS/REGA/REGX/REGY/REGEA,-(SP)
  698.                                  /* convert   P register NV_BDIZC
  699.                                          to CCR register BDIXNZVC */
  700.         MOVE.B  REGST,DBUS       /* BDI */
  701.         MOVE.B  REGST,REGA       /* N */
  702.         MOVE.B  REGST,REGX       /* V */
  703.         MOVE.B  REGST,REGY       /* Z */
  704.         MOVE.B  REGST,REGEA      /* set X equal to C */
  705.         ASL.B   #3,DBUS
  706.         AND.B   #0xE0,DBUS       /* BDI_____ */
  707.         ASL.B   #4,REGEA
  708.         AND.B   #BITX,REGEA      /* ___X____ */
  709.         ASL.B   #1,REGY
  710.         AND.B   #BITZ,REGY       /* _____Z__ */
  711.         ASR.B   #4,REGA
  712.         AND.B   #BITN,REGA       /* ____N___ */
  713.         ASR.B   #5,REGX
  714.         AND.B   #BITV,REGX       /* ______V_ */
  715.         MOVE.B  REGEA,REGST
  716.         OR.B    REGX,REGST
  717.         OR.B    REGY,REGST
  718.         OR.B    REGA,REGST
  719.         OR.B    DBUS,REGST       /* that gets BDIXNZVC !!! */
  720.         MOVEM.L (SP)+,DBUS/REGA/REGX/REGY/REGEA
  721.         JMP     (REGEMUL)
  722.  
  723.   op29: AND.B   (REGMPC)+,REGA           /* AND # */
  724.         MOVE.W  SR,DBUS
  725.         AND.B   #(BITN|BITZ),DBUS
  726.         AND.B   #~(BITN|BITZ),REGST
  727.         OR.B    DBUS,REGST
  728.         JMP     (REGEMUL)
  729.  
  730.   op2A:                                   /* ROL A */
  731.         MOVE.B  REGST,CCR                 /* prepare X bit */
  732.         ROXL.B  #1,REGA
  733.         MOVE.W  SR,DBUS
  734.         AND.B   #(BITN|BITZ|BITX),DBUS   /* update flags N Z C */
  735.         AND.B   #~(BITN|BITZ|BITX),REGST
  736.         OR.B    DBUS,REGST
  737.         JMP     (REGEMUL)
  738.  
  739.   op2B: JMP     (REGEMUL)
  740.  
  741.   op2C:                                   /* BIT abs */
  742.         MOVE.B  1(REGMPC),-(SP)
  743.         MOVE.W  (SP)+,REGEA
  744.         MOVE.B  (REGMPC),REGEA
  745.         ADDQ.W  #2,REGMPC
  746.         MOVE.B  0(REGSTAT,REGEA.W),IR
  747.         BPL     BITread
  748.         SETREAD
  749.         BSR     emul_serv
  750.   BITread:
  751.         MOVE.L  REGEA,REGMEA
  752.         TST.B   (REGMEA)         /* BUG!! BUG!!! V bit not set!!!! */
  753.         MOVE.W  SR,DBUS
  754.         AND.B   #(BITN|BITZ),DBUS
  755.         AND.B   #~(BITN|BITZ),REGST
  756.         OR.B    DBUS,REGST
  757.         JMP     (REGEMUL)
  758.  
  759.   op2D:                                   /* AND abs */
  760.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  761.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  762.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  763.         ADDQ.W  #2,REGMPC
  764.         BRA     doAND
  765.  
  766.   op2E:                                   /* ROL abs */
  767.         MOVE.B  1(REGMPC),-(SP)
  768.         MOVE.W  (SP)+,REGEA
  769.         MOVE.B  (REGMPC),REGEA
  770.         ADDQ.W  #2,REGMPC
  771.         BRA     doROL
  772.  
  773.   op2F: JMP     (REGEMUL)
  774.  
  775.   op30: BTST    #3,REGST     /* BMI */
  776.         BEQ     nobmi        /* BITN = 0x08 = bit #3 */
  777.         MOVE.B  (REGMPC)+,DBUS
  778.         EXT.W   DBUS
  779.         ADDA.W  DBUS,REGMPC
  780.         JMP     (REGEMUL)
  781.     nobmi:
  782.         ADDQ.L  #1,REGMPC
  783.         JMP     (REGEMUL)
  784.  
  785.   op31: CLR.W   REGEA                     /* AND (zp),Y */
  786.         MOVE.B  (REGMPC)+,REGEA
  787.         MOVE.L  REGEA,REGMEA
  788.         MOVE.B  1(REGMEA),-(SP)
  789.         MOVE.W  (SP)+,REGEA
  790.         MOVE.B  (REGMEA),REGEA
  791.         ADD.W   REGY,REGEA
  792.         BRA     doAND
  793.  
  794.   op32: JMP     (REGEMUL)
  795.  
  796.   op33: JMP     (REGEMUL)
  797.  
  798.   op34: JMP     (REGEMUL)
  799.  
  800.   op35: CLR.W   REGEA                     /* AND zp,X */
  801.         MOVE.B  (REGMPC)+,REGEA
  802.         ADD.B   REGX,REGEA
  803.         BRA     ANDread
  804.  
  805.   op36: CLR.W   REGEA                     /* ROL zp,X */
  806.         MOVE.B  (REGMPC)+,REGEA
  807.         ADD.B   REGX,REGEA
  808.         BRA     doROL
  809.  
  810.   op37: JMP     (REGEMUL)
  811.  
  812.   op38: ORI.B   #BITX,REGST      /* SEC */
  813.         JMP     (REGEMUL)
  814.  
  815.   op39:                                   /* AND abs,Y */
  816.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  817.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  818.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  819.         ADD.W   REGY,REGEA
  820.         ADDQ.W  #2,REGMPC
  821.         BRA     doAND
  822.  
  823.   op3A: JMP     (REGEMUL)
  824.  
  825.   op3B: JMP     (REGEMUL)
  826.  
  827.   op3C: JMP     (REGEMUL)
  828.  
  829.   op3D:                                   /* AND abs,X */
  830.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  831.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  832.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  833.         ADD.W   REGX,REGEA
  834.         ADDQ.W  #2,REGMPC
  835.         BRA     doAND
  836.  
  837.   op3E:                                /* ROL abs,X */
  838.         MOVE.B  1(REGMPC),-(SP)
  839.         MOVE.W  (SP)+,REGEA
  840.         MOVE.B  (REGMPC),REGEA
  841.         ADD.W   REGX,REGEA
  842.         ADDQ.W  #2,REGMPC
  843.         BRA     doROL
  844.  
  845.   op3F: JMP     (REGEMUL)
  846.  
  847.   op40:                                    /* RTI */
  848.         MOVE.W  REGSP,REGEA
  849.         MOVE.L  REGEA,REGMEA
  850.         MOVE.B  1(REGMEA),REGPC      /* pull PClo */
  851.         MOVE.B  2(REGMEA),-(SP)  /* pull PChi */
  852.         MOVE.W  (SP)+,REGPC
  853.         MOVE.B  3(REGMEA),REGST      /* pull processor */
  854.         ADDQ.B  #3,REGSP
  855.         ADDQ.W  #1,REGPC
  856.         MOVE.L  REGPC,REGMPC
  857.         JMP     (REGEMUL)
  858.  
  859.   op41: CLR.W   REGEA                     /* EOR (zp,X) */
  860.         MOVE.B  (REGMPC)+,REGEA
  861.         ADD.B   REGX,REGEA
  862.         MOVE.L  REGEA,REGMEA
  863.         MOVE.B  1(REGMEA),-(SP)
  864.         MOVE.W  (SP)+,REGEA
  865.         MOVE.B  (REGMEA),REGEA
  866.         BRA     doEOR
  867.  
  868.   op42: JMP     (REGEMUL)
  869.  
  870.   op43: JMP     (REGEMUL)
  871.  
  872.   op44: JMP     (REGEMUL)
  873.  
  874.   op45: CLR.W   REGEA                     /* EOR zp */
  875.         MOVE.B  (REGMPC)+,REGEA
  876.         BRA     EORread
  877.  
  878.   op46: CLR.W   REGEA                     /* LSR zp */
  879.         MOVE.B  (REGMPC)+,REGEA
  880.         BRA     doLSR
  881.  
  882.   op47: JMP     (REGEMUL)
  883.  
  884.   op48:                            /* PHA */
  885.         MOVE.W  REGSP,REGEA
  886.         MOVE.L  REGEA,REGMEA
  887.         MOVE.B  REGA,(REGMEA)     /* push acc */
  888.         SUBQ.B  #1,REGSP
  889.         JMP     (REGEMUL)
  890.  
  891.   op49: MOVE.B  (REGMPC)+,DBUS       /* EOR # */
  892.         EOR.B   DBUS,REGA
  893.         MOVE.W  SR,DBUS
  894.         AND.B   #(BITN|BITZ),DBUS
  895.         AND.B   #~(BITN|BITZ),REGST
  896.         OR.B    DBUS,REGST
  897.         JMP     (REGEMUL)
  898.  
  899.   op4A:                                   /* LSR A */
  900.         LSR.B   #1,REGA                   /* shift it */
  901.         MOVE.W  SR,DBUS
  902.         AND.B   #(BITN|BITZ|BITX),DBUS   /* update flags N Z C */
  903.         AND.B   #~(BITN|BITZ|BITX),REGST
  904.         OR.B    DBUS,REGST
  905.         JMP     (REGEMUL)
  906.  
  907.   op4B: JMP     (REGEMUL)
  908.  
  909.   op4C:                               /* JMP abs */
  910.         MOVE.B  1(REGMPC),-(SP)
  911.         MOVE.W  (SP)+,REGPC
  912.         MOVE.B  (REGMPC),REGPC
  913.         MOVE.L  REGPC,REGMPC
  914.         JMP     (REGEMUL)
  915.  
  916.   op4D:                                   /* EOR abs */
  917.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  918.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  919.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  920.         ADDQ.W  #2,REGMPC
  921.         BRA     doEOR
  922.  
  923.   op4E:                                   /* LSR abs */
  924.         MOVE.B  1(REGMPC),-(SP)
  925.         MOVE.W  (SP)+,REGEA
  926.         MOVE.B  (REGMPC),REGEA
  927.         ADDQ.W  #2,REGMPC
  928.         BRA     doLSR
  929.  
  930.   op4F: JMP     (REGEMUL)
  931.  
  932.   op50: BTST    #1,REGST     /* BVC */
  933.         BNE     nobvc        /* BITV = 0x02 = bit #1 */
  934.         MOVE.B  (REGMPC)+,DBUS
  935.         EXT.W   DBUS
  936.         ADDA.W  DBUS,REGMPC
  937.         JMP     (REGEMUL)
  938.     nobvc:
  939.         ADDQ.L  #1,REGMPC
  940.         JMP     (REGEMUL)
  941.  
  942.   op51: CLR.W   REGEA                     /* EOR (zp),Y */
  943.         MOVE.B  (REGMPC)+,REGEA
  944.         MOVE.L  REGEA,REGMEA
  945.         MOVE.B  1(REGMEA),-(SP)       /* get hi byte */
  946.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  947.         MOVE.B  (REGMEA),REGEA            /* get lo byte */
  948.         ADD.W   REGY,REGEA
  949.         BRA     doEOR
  950.  
  951.   op52: JMP     (REGEMUL)
  952.  
  953.   op53: JMP     (REGEMUL)
  954.  
  955.   op54: JMP     (REGEMUL)
  956.  
  957.   op55: CLR.W   REGEA                     /* EOR zp,X */
  958.         MOVE.B  (REGMPC)+,REGEA
  959.         ADD.B   REGX,REGEA
  960.         BRA     EORread
  961.  
  962.   op56: CLR.W   REGEA                      /* LSR zp,X */
  963.         MOVE.B  (REGMPC)+,REGEA
  964.         ADD.B   REGX,REGEA
  965.         BRA     doLSR
  966.  
  967.   op57: JMP     (REGEMUL)
  968.  
  969.   op58: ANDI.B  #~BITI,REGST      /* CLI */
  970.         JMP     (REGEMUL)
  971.  
  972.   op59:                                   /* EOR abs,Y */
  973.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  974.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  975.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  976.         ADD.W   REGY,REGEA
  977.         ADDQ.W  #2,REGMPC
  978.         BRA     doEOR
  979.  
  980.   op5A: JMP     (REGEMUL)
  981.  
  982.   op5B: JMP     (REGEMUL)
  983.  
  984.   op5C: JMP     (REGEMUL)
  985.  
  986.   op5D:                                   /* EOR abs,X */
  987.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  988.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  989.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  990.         ADD.W   REGX,REGEA
  991.         ADDQ.W  #2,REGMPC
  992.         BRA     doEOR
  993.  
  994.   op5E:                                /* LSR abs,X */
  995.         MOVE.B  1(REGMPC),-(SP)
  996.         MOVE.W  (SP)+,REGEA
  997.         MOVE.B  (REGMPC),REGEA
  998.         ADD.W   REGX,REGEA
  999.         ADDQ.W  #2,REGMPC
  1000.         BRA     doLSR
  1001.  
  1002.   op5F: JMP     (REGEMUL)
  1003.  
  1004.   op60:                            /* RTS */
  1005.         MOVE.W  REGSP,REGEA
  1006.         MOVE.L  REGEA,REGMEA
  1007.         MOVE.B  2(REGMEA),-(SP)     /* pull PChi */
  1008.         MOVE.W  (SP)+,REGPC
  1009.         MOVE.B  1(REGMEA),REGPC      /* pull PClo */
  1010.         ADDQ.B  #2,REGSP
  1011.         ADDQ.W  #1,REGPC
  1012.         MOVE.L  REGPC,REGMPC
  1013.         JMP     (REGEMUL)
  1014.  
  1015.   op61: CLR.W   REGEA                     /* ADC (zp,X) */
  1016.         MOVE.B  (REGMPC)+,REGEA
  1017.         ADD.B   REGX,REGEA
  1018.         MOVE.L  REGEA,REGMEA
  1019.         MOVE.B  1(REGMEA),-(SP)
  1020.         MOVE.W  (SP)+,REGEA
  1021.         MOVE.B  (REGMEA),REGEA
  1022.         BRA     doADC
  1023.  
  1024.   op62: JMP     (REGEMUL)
  1025.  
  1026.   op63: JMP     (REGEMUL)
  1027.  
  1028.   op64: JMP     (REGEMUL)
  1029.  
  1030.   op65: CLR.W   REGEA                     /* ADC zp */
  1031.         MOVE.B  (REGMPC)+,REGEA
  1032.         BRA     doADC
  1033.  
  1034.   op66: CLR.W   REGEA                     /* ROR zp */
  1035.         MOVE.B  (REGMPC)+,REGEA
  1036.         BRA     doROR
  1037.  
  1038.   op67: JMP     (REGEMUL)
  1039.  
  1040.   op68:                            /* PLA */
  1041.         ADDQ.B  #1,REGSP
  1042.         MOVE.W  REGSP,REGEA
  1043.         MOVE.L  REGEA,REGMEA
  1044.         MOVE.B  (REGMEA),REGA
  1045.         MOVE.W  SR,DBUS
  1046.         AND.B   #(BITN|BITZ),DBUS
  1047.         AND.B   #~(BITN|BITZ),REGST
  1048.         OR.B    DBUS,REGST
  1049.         JMP     (REGEMUL)
  1050.  
  1051.   op69: MOVE.B  (REGMPC)+,DBUS           /* ADC # */
  1052.         ORI.B   #BITZ,REGST    /* SUBX doesn't set Z flag */
  1053.         MOVE.B  REGST,CCR
  1054.         ADDX.B  DBUS,REGA
  1055.         MOVE.W  SR,DBUS
  1056.         AND.B   #(BITN|BITZ|BITX|BITV),DBUS
  1057.         AND.B   #~(BITN|BITZ|BITX|BITV),REGST
  1058.         OR.B    DBUS,REGST
  1059.         JMP     (REGEMUL)
  1060.  
  1061.   op6A:                                   /* ROR A */
  1062.         MOVE.B  REGST,CCR                 /* prepare carry bit */
  1063.         ROXR.B  #1,REGA
  1064.         MOVE.W  SR,DBUS
  1065.         AND.B   #(BITN|BITZ|BITX),DBUS   /* update flags N Z C */
  1066.         AND.B   #~(BITN|BITZ|BITX),REGST
  1067.         OR.B    DBUS,REGST
  1068.         JMP     (REGEMUL)
  1069.  
  1070.   op6B: JMP     (REGEMUL)
  1071.  
  1072.   op6C:                                   /* JMP (abs) */
  1073.         MOVE.B  1(REGMPC),-(SP)
  1074.         MOVE.W  (SP)+,REGPC
  1075.         MOVE.B  (REGMPC),REGPC
  1076.         MOVE.W  REGPC,REGEA           /* get vector */
  1077.         MOVE.L  REGEA,REGMEA
  1078.         MOVE.B  1(REGMEA),-(SP)
  1079.         MOVE.W  (SP)+,REGPC
  1080.         MOVE.B  (REGMEA),REGPC
  1081.         MOVE.L  REGPC,REGMPC
  1082.         JMP     (REGEMUL)
  1083.  
  1084.   op6D:                                   /* ADC abs */
  1085.         MOVE.B  1(REGMPC),-(SP)
  1086.         MOVE.W  (SP)+,REGEA
  1087.         MOVE.B  (REGMPC),REGEA
  1088.         ADDQ.W  #2,REGMPC
  1089.         BRA     doADC
  1090.  
  1091.   op6E:                                   /* ROR abs */
  1092.         MOVE.B  1(REGMPC),-(SP)
  1093.         MOVE.W  (SP)+,REGEA
  1094.         MOVE.B  (REGMPC),REGEA
  1095.         ADDQ.W  #2,REGMPC
  1096.         BRA     doROR
  1097.  
  1098.   op6F: JMP     (REGEMUL)
  1099.  
  1100.   op70: BTST    #1,REGST     /* BVS */
  1101.         BEQ     nobvs        /* BITV = 0x02 = bit #1 */
  1102.         MOVE.B  (REGMPC)+,DBUS
  1103.         EXT.W   DBUS
  1104.         ADDA.W  DBUS,REGMPC
  1105.         JMP     (REGEMUL)
  1106.     nobvs:
  1107.         ADDQ.L  #1,REGMPC
  1108.         JMP     (REGEMUL)
  1109.  
  1110.   op71: CLR.W   REGEA                     /* ADC (zp),Y */
  1111.         MOVE.B  (REGMPC)+,REGEA
  1112.         MOVE.L  REGEA,REGMEA
  1113.         MOVE.B  1(REGMEA),-(SP)
  1114.         MOVE.W  (SP)+,REGEA
  1115.         MOVE.B  (REGMEA),REGEA
  1116.         ADD.W   REGY,REGEA
  1117.         BRA     doADC
  1118.  
  1119.   op72: JMP     (REGEMUL)
  1120.  
  1121.   op73: JMP     (REGEMUL)
  1122.  
  1123.   op74: JMP     (REGEMUL)
  1124.  
  1125.   op75: CLR.W   REGEA                     /* ADC zp,X */
  1126.         MOVE.B  (REGMPC)+,REGEA
  1127.         ADD.B   REGX,REGEA
  1128.         BRA     doADC
  1129.  
  1130.   op76: CLR.W   REGEA                     /* ROR zp,X */
  1131.         MOVE.B  (REGMPC)+,REGEA
  1132.         ADD.B   REGX,REGEA
  1133.         BRA     doROR
  1134.  
  1135.   op77: JMP     (REGEMUL)
  1136.  
  1137.   op78: ORI.B   #BITX,REGST      /* SEC */
  1138.         JMP     (REGEMUL)
  1139.  
  1140.   op79:                                   /* ADC abs,Y */
  1141.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  1142.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1143.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  1144.         ADD.W   REGY,REGEA
  1145.         ADDQ.W  #2,REGMPC
  1146.         BRA     doADC
  1147.  
  1148.   op7A: JMP     (REGEMUL)
  1149.  
  1150.   op7B: JMP     (REGEMUL)
  1151.  
  1152.   op7C: JMP     (REGEMUL)
  1153.  
  1154.   op7D:                                   /* ADC abs,X */
  1155.         MOVE.B  1(REGMPC),-(SP)
  1156.         MOVE.W  (SP)+,REGEA
  1157.         MOVE.B  (REGMPC),REGEA
  1158.         ADD.W   REGX,REGEA
  1159.         ADDQ.W  #2,REGMPC
  1160.         BRA     doADC
  1161.  
  1162.   op7E:                                /* ROR abs,X */
  1163.         MOVE.B  1(REGMPC),-(SP)
  1164.         MOVE.W  (SP)+,REGEA
  1165.         MOVE.B  (REGMPC),REGEA
  1166.         ADD.W   REGX,REGEA
  1167.         ADDQ.W  #2,REGMPC
  1168.         BRA     doROR
  1169.  
  1170.   op7F: JMP     (REGEMUL)
  1171.  
  1172.   op80: JMP     (REGEMUL)
  1173.  
  1174.   op81: CLR.W   REGEA                     /* STA (zp,X) */
  1175.         MOVE.B  (REGMPC)+,REGEA
  1176.         ADD.B   REGX,REGEA
  1177.         MOVE.L  REGEA,REGMEA
  1178.         MOVE.B  1(REGMEA),-(SP)
  1179.         MOVE.W  (SP)+,REGEA
  1180.         MOVE.B  (REGMEA),REGEA
  1181.         BRA     doSTA
  1182.  
  1183.   op82: JMP     (REGEMUL)
  1184.  
  1185.   op83: JMP     (REGEMUL)
  1186.  
  1187.   op84: CLR.W   REGEA                     /* STY zp */
  1188.         MOVE.B  (REGMPC)+,REGEA
  1189.         MOVE.L  REGEA,REGMEA
  1190.         MOVE.B  REGY,(REGMEA)
  1191.         JMP     (REGEMUL)
  1192.  
  1193.   op85: CLR.W   REGEA                     /* STA zp */
  1194.         MOVE.B  (REGMPC)+,REGEA
  1195.         MOVE.L  REGEA,REGMEA
  1196.         MOVE.B  REGA,(REGMEA)
  1197.         JMP     (REGEMUL)
  1198.  
  1199.   op86: CLR.W   REGEA                     /* STX zp */
  1200.         MOVE.B  (REGMPC)+,REGEA
  1201.         MOVE.L  REGEA,REGMEA
  1202.         MOVE.B  REGX,(REGMEA)
  1203.         JMP     (REGEMUL)
  1204.  
  1205.   op87: JMP     (REGEMUL)
  1206.  
  1207.   op88: SUBQ.B  #1,REGY           /* DEY */
  1208.         MOVE.W  SR,DBUS
  1209.         AND.B   #(BITN|BITZ),DBUS
  1210.         AND.B   #~(BITN|BITZ),REGST
  1211.         OR.B    DBUS,REGST
  1212.         JMP     (REGEMUL)
  1213.  
  1214.   op89: JMP     (REGEMUL)
  1215.  
  1216.   op8A: MOVE.B  REGX,REGA                 /* TXA */
  1217.         MOVE.W  SR,DBUS
  1218.         AND.B   #(BITN|BITZ),DBUS
  1219.         AND.B   #~(BITN|BITZ),REGST
  1220.         OR.B    DBUS,REGST
  1221.         JMP     (REGEMUL)
  1222.  
  1223.   op8B: JMP     (REGEMUL)
  1224.  
  1225.   op8C:                                   /* STY abs */
  1226.         MOVE.B  1(REGMPC),-(SP)
  1227.         MOVE.W  (SP)+,REGEA
  1228.         MOVE.B  (REGMPC),REGEA
  1229.         ADDQ.W  #2,REGMPC
  1230.         BRA     doSTY
  1231.  
  1232.   op8D:                                   /* STA abs */
  1233.         MOVE.B  1(REGMPC),-(SP)
  1234.         MOVE.W  (SP)+,REGEA
  1235.         MOVE.B  (REGMPC),REGEA
  1236.         ADDQ.W  #2,REGMPC
  1237.         BRA     doSTA
  1238.  
  1239.   op8E:                                   /* STX abs */
  1240.         MOVE.B  1(REGMPC),-(SP)
  1241.         MOVE.W  (SP)+,REGEA
  1242.         MOVE.B  (REGMPC),REGEA
  1243.         ADDQ.W  #2,REGMPC
  1244.         BRA     doSTX
  1245.  
  1246.   op8F: JMP     (REGEMUL)
  1247.  
  1248.   op90: BTST    #4,REGST     /* BCC */
  1249.         BNE     nobcc        /* BITX = 0x10 = bit #4 */
  1250.         MOVE.B  (REGMPC)+,DBUS
  1251.         EXT.W   DBUS
  1252.         ADDA.W  DBUS,REGMPC
  1253.         JMP     (REGEMUL)
  1254.     nobcc:
  1255.         ADDQ.L  #1,REGMPC
  1256.         JMP     (REGEMUL)
  1257.  
  1258.   op91: CLR.W   REGEA                     /* STA (zp),Y */
  1259.         MOVE.B  (REGMPC)+,REGEA
  1260.         MOVE.L  REGEA,REGMEA
  1261.         MOVE.B  1(REGMEA),-(SP)
  1262.         MOVE.W  (SP)+,REGEA
  1263.         MOVE.B  (REGMEA),REGEA
  1264.         ADD.W   REGY,REGEA
  1265.         BRA     doSTA
  1266.  
  1267.   op92: JMP     (REGEMUL)
  1268.  
  1269.   op93: JMP     (REGEMUL)
  1270.  
  1271.   op94: CLR.W   REGEA                     /* STY zp,X */
  1272.         MOVE.B  (REGMPC)+,REGEA
  1273.         ADD.B   REGX,REGEA
  1274.         MOVE.L  REGEA,REGMEA
  1275.         MOVE.B  REGY,(REGMEA)
  1276.         JMP     (REGEMUL)
  1277.  
  1278.   op95: CLR.W   REGEA                     /* STA zp,X */
  1279.         MOVE.B  (REGMPC)+,REGEA
  1280.         ADD.B   REGX,REGEA
  1281.         MOVE.L  REGEA,REGMEA
  1282.         MOVE.B  REGA,(REGMEA)
  1283.         JMP     (REGEMUL)
  1284.  
  1285.   op96: CLR.W   REGEA                     /* STX zp,Y */
  1286.         MOVE.B  (REGMPC)+,REGEA
  1287.         ADD.B   REGY,REGEA
  1288.         MOVE.L  REGEA,REGMEA
  1289.         MOVE.B  REGX,(REGMEA)
  1290.         JMP     (REGEMUL)
  1291.  
  1292.   op97: JMP     (REGEMUL)
  1293.  
  1294.   op98: MOVE.B  REGY,REGA                 /* TYA */
  1295.         MOVE.W  SR,DBUS
  1296.         AND.B   #(BITN|BITZ),DBUS
  1297.         AND.B   #~(BITN|BITZ),REGST
  1298.         OR.B    DBUS,REGST
  1299.         JMP     (REGEMUL)
  1300.  
  1301.   op99:                                   /* STA abs,Y */
  1302.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  1303.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1304.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  1305.         ADD.W   REGY,REGEA
  1306.         ADDQ.W  #2,REGMPC
  1307.         BRA     doSTA
  1308.  
  1309.   op9A: MOVE.B  REGX,REGSP            /* TXS */
  1310.         JMP     (REGEMUL)
  1311.  
  1312.   op9B: JMP     (REGEMUL)
  1313.  
  1314.   op9C: JMP     (REGEMUL)
  1315.  
  1316.   op9D:                                   /* STA abs,X */
  1317.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  1318.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1319.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  1320.         ADD.W   REGX,REGEA
  1321.         ADDQ.W  #2,REGMPC
  1322.         BRA     doSTA
  1323.  
  1324.   op9E: JMP     (REGEMUL)
  1325.  
  1326.   op9F: JMP     (REGEMUL)
  1327.  
  1328.   opA0: MOVE.B  (REGMPC)+,REGY    /* LDY # */
  1329.         MOVE.W  SR,DBUS
  1330.         AND.B   #(BITN|BITZ),DBUS
  1331.         AND.B   #~(BITN|BITZ),REGST
  1332.         OR.B    DBUS,REGST
  1333.         JMP     (REGEMUL)
  1334.  
  1335.   opA1: CLR.W   REGEA                     /* LDA (zp,X) */
  1336.         MOVE.B  (REGMPC)+,REGEA
  1337.         ADD.B   REGX,REGEA
  1338.         MOVE.L  REGEA,REGMEA
  1339.         MOVE.B  1(REGMEA),-(SP)
  1340.         MOVE.W  (SP)+,REGEA
  1341.         MOVE.B  (REGMEA),REGEA
  1342.         BRA     doLDA
  1343.  
  1344.   opA2: MOVE.B  (REGMPC)+,REGX    /* LDX # */
  1345.         MOVE.W  SR,DBUS
  1346.         AND.B   #(BITN|BITZ),DBUS
  1347.         AND.B   #~(BITN|BITZ),REGST
  1348.         OR.B    DBUS,REGST
  1349.         JMP     (REGEMUL)
  1350.  
  1351.   opA3: JMP     (REGEMUL)
  1352.  
  1353.   opA4: CLR.W   REGEA                     /* LDY zp */
  1354.         MOVE.B  (REGMPC)+,REGEA
  1355.         BRA     LDYread
  1356.  
  1357.   opA5: CLR.W   REGEA                     /* LDA zp */
  1358.         MOVE.B  (REGMPC)+,REGEA
  1359.         BRA     LDAread
  1360.  
  1361.   opA6: CLR.W   REGEA                     /* LDX zp */
  1362.         MOVE.B  (REGMPC)+,REGEA
  1363.         BRA     LDXread
  1364.  
  1365.   opA7: JMP     (REGEMUL)
  1366.  
  1367.   opA8: MOVE.B  REGA,REGY                 /* TAY */
  1368.         MOVE.W  SR,DBUS
  1369.         AND.B   #(BITN|BITZ),DBUS
  1370.         AND.B   #~(BITN|BITZ),REGST
  1371.         OR.B    DBUS,REGST
  1372.         JMP     (REGEMUL)
  1373.  
  1374.   opA9: MOVE.B  (REGMPC)+,REGA           /* LDA # */
  1375.         MOVE.W  SR,DBUS
  1376.         AND.B   #(BITN|BITZ),DBUS
  1377.         AND.B   #~(BITN|BITZ),REGST
  1378.         OR.B    DBUS,REGST
  1379.         JMP     (REGEMUL)
  1380.  
  1381.   opAA: MOVE.B  REGA,REGX                 /* TAX */
  1382.         MOVE.W  SR,DBUS
  1383.         AND.B   #(BITN|BITZ),DBUS
  1384.         AND.B   #~(BITN|BITZ),REGST
  1385.         OR.B    DBUS,REGST
  1386.         JMP     (REGEMUL)
  1387.  
  1388.   opAB: JMP     (REGEMUL)
  1389.  
  1390.   opAC:                                   /* LDY abs */
  1391.         MOVE.B  1(REGMPC),-(SP)
  1392.         MOVE.W  (SP)+,REGEA
  1393.         MOVE.B  (REGMPC),REGEA
  1394.         ADDQ.W  #2,REGMPC
  1395.         BRA     doLDY
  1396.  
  1397.   opAD:                                   /* LDA abs */
  1398.         MOVE.B  1(REGMPC),-(SP)
  1399.         MOVE.W  (SP)+,REGEA
  1400.         MOVE.B  (REGMPC),REGEA
  1401.         ADDQ.W  #2,REGMPC
  1402.         BRA     doLDA
  1403.  
  1404.   opAE:                                   /* LDX abs */
  1405.         MOVE.B  1(REGMPC),-(SP)
  1406.         MOVE.W  (SP)+,REGEA
  1407.         MOVE.B  (REGMPC),REGEA
  1408.         ADDQ.W  #2,REGMPC
  1409.         BRA     doLDX
  1410.  
  1411.   opAF: JMP     (REGEMUL)
  1412.  
  1413.   opB0: BTST    #4,REGST     /* BCS */
  1414.         BEQ     nobcs        /* BITX= 0x10 = bit #4 */
  1415.         MOVE.B  (REGMPC)+,DBUS
  1416.         EXT.W   DBUS
  1417.         ADDA.W  DBUS,REGMPC
  1418.         JMP     (REGEMUL)
  1419.     nobcs:
  1420.         ADDQ.L  #1,REGMPC
  1421.         JMP     (REGEMUL)
  1422.  
  1423.   opB1: CLR.W   REGEA                     /* LDA (zp),Y */
  1424.         MOVE.B  (REGMPC)+,REGEA
  1425.         MOVE.L  REGEA,REGMEA
  1426.         MOVE.B  1(REGMEA),-(SP)
  1427.         MOVE.W  (SP)+,REGEA
  1428.         MOVE.B  (REGMEA),REGEA
  1429.         ADD.W   REGY,REGEA
  1430.         BRA     doLDA
  1431.  
  1432.   opB2: JMP     (REGEMUL)
  1433.  
  1434.   opB3: JMP     (REGEMUL)
  1435.  
  1436.   opB4: CLR.W   REGEA                     /* LDY zp,X */
  1437.         MOVE.B  (REGMPC)+,REGEA
  1438.         ADD.B   REGX,REGEA
  1439.         BRA     LDYread
  1440.  
  1441.   opB5: CLR.W   REGEA                     /* LDA zp,X */
  1442.         MOVE.B  (REGMPC)+,REGEA
  1443.         ADD.B   REGX,REGEA
  1444.         BRA     LDAread
  1445.  
  1446.   opB6: CLR.W   REGEA                     /* LDX zp,Y */
  1447.         MOVE.B  (REGMPC)+,REGEA
  1448.         ADD.B   REGY,REGEA
  1449.         BRA     LDXread
  1450.  
  1451.   opB7: JMP     (REGEMUL)
  1452.  
  1453.   opB8: ANDI.B  #~BITV,REGST      /* CLV */
  1454.         JMP     (REGEMUL)
  1455.  
  1456.   opB9:                                   /* LDA abs,Y */
  1457.         MOVE.B  1(REGMPC),-(SP)
  1458.         MOVE.W  (SP)+,REGEA
  1459.         MOVE.B  (REGMPC),REGEA
  1460.         ADD.W   REGY,REGEA
  1461.         ADDQ.W  #2,REGMPC
  1462.         BRA     doLDA
  1463.  
  1464.   opBA: MOVE.B  REGSP,REGX                 /* TAX */
  1465.         MOVE.W  SR,DBUS
  1466.         AND.B   #(BITN|BITZ),DBUS
  1467.         AND.B   #~(BITN|BITZ),REGST
  1468.         OR.B    DBUS,REGST
  1469.         JMP     (REGEMUL)
  1470.  
  1471.   opBB: JMP     (REGEMUL)
  1472.  
  1473.   opBC:                                   /* LDY abs,X */
  1474.         MOVE.B  1(REGMPC),-(SP)
  1475.         MOVE.W  (SP)+,REGEA
  1476.         MOVE.B  (REGMPC),REGEA
  1477.         ADD.W   REGX,REGEA
  1478.         ADDQ.W  #2,REGMPC
  1479.         BRA     doLDY
  1480.  
  1481.   opBD:                                   /* LDA abs,X */
  1482.         MOVE.B  1(REGMPC),-(SP)
  1483.         MOVE.W  (SP)+,REGEA
  1484.         MOVE.B  (REGMPC),REGEA
  1485.         ADD.W   REGX,REGEA
  1486.         ADDQ.W  #2,REGMPC
  1487.         BRA     doLDA
  1488.  
  1489.   opBE:                                   /* LDX abs,Y */
  1490.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  1491.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1492.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  1493.         ADD.W   REGY,REGEA
  1494.         ADDQ.W  #2,REGMPC
  1495.         BRA     doLDX
  1496.  
  1497.   opBF: JMP     (REGEMUL)
  1498.  
  1499.   opC0:                                  /* CPY # */
  1500.         MOVE.B  (REGMPC)+,DBUS
  1501.         SUB.B   REGY,DBUS
  1502.         BEQ     opC02
  1503.         MOVE.W  SR,DBUS
  1504.         AND.B   #(BITN|BITZ|BITX),DBUS
  1505.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1506.         AND.B   #~(BITN|BITZ|BITX),REGST
  1507.         OR.B    DBUS,REGST
  1508.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1509.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1510.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1511.         OR.B    DBUS,REGST      /* carry flag must be set */
  1512.         JMP     (REGEMUL)
  1513.   opC02:
  1514.         MOVE.W  SR,DBUS
  1515.         AND.B   #(BITN|BITZ|BITX),DBUS
  1516.         AND.B   #~(BITN|BITZ|BITX),REGST
  1517.         OR.B    DBUS,REGST
  1518.         ADD.B   DBUS,DBUS
  1519.         ADD.B   DBUS,DBUS
  1520.         AND.B   #(BITX),DBUS
  1521.         OR.B    DBUS,REGST
  1522.         JMP     (REGEMUL)
  1523.  
  1524.   opC1: CLR.W   REGEA                     /* CMP (zp,X) */
  1525.         MOVE.B  (REGMPC)+,REGEA
  1526.         ADD.B   REGX,REGEA
  1527.         MOVE.L  REGEA,REGMEA
  1528.         MOVE.B  1(REGMEA),-(SP)       /* get hi byte */
  1529.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1530.         MOVE.B  (REGMEA),REGEA            /* get lo byte */
  1531.         MOVE.L  REGEA,REGMEA
  1532.         MOVE.B  (REGMEA),DBUS
  1533.         SUB.B   REGA,DBUS
  1534.         BEQ     opC12
  1535.         MOVE.W  SR,DBUS
  1536.         AND.B   #(BITN|BITZ|BITX),DBUS
  1537.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1538.         AND.B   #~(BITN|BITZ|BITX),REGST
  1539.         OR.B    DBUS,REGST
  1540.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1541.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1542.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1543.         OR.B    DBUS,REGST      /* carry flag must be set */
  1544.         JMP     (REGEMUL)
  1545.    opC12:
  1546.         MOVE.W  SR,DBUS
  1547.         AND.B   #(BITN|BITZ|BITX),DBUS
  1548.         AND.B   #~(BITN|BITZ|BITX),REGST
  1549.         OR.B    DBUS,REGST
  1550.         ADD.B   DBUS,DBUS
  1551.         ADD.B   DBUS,DBUS
  1552.         AND.B   #(BITX),DBUS
  1553.         OR.B    DBUS,REGST
  1554.         JMP     (REGEMUL)
  1555.  
  1556.   opC2: JMP     (REGEMUL)
  1557.  
  1558.   opC3: JMP     (REGEMUL)
  1559.  
  1560.   opC4: CLR.W   REGEA                     /* CPY zp */
  1561.         MOVE.B  (REGMPC)+,REGEA
  1562.         MOVE.L  REGEA,REGMEA
  1563.         MOVE.B  (REGMEA),DBUS
  1564.         SUB.B   REGY,DBUS
  1565.         BEQ     opC42
  1566.         MOVE.W  SR,DBUS
  1567.         AND.B   #(BITN|BITZ|BITX),DBUS
  1568.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1569.         AND.B   #~(BITN|BITZ|BITX),REGST
  1570.         OR.B    DBUS,REGST
  1571.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1572.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1573.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1574.         OR.B    DBUS,REGST      /* carry flag must be set */
  1575.         JMP     (REGEMUL)
  1576.    opC42:
  1577.         MOVE.W  SR,DBUS
  1578.         AND.B   #(BITN|BITZ|BITX),DBUS
  1579.         AND.B   #~(BITN|BITZ|BITX),REGST
  1580.         OR.B    DBUS,REGST
  1581.         ADD.B   DBUS,DBUS
  1582.         ADD.B   DBUS,DBUS
  1583.         AND.B   #(BITX),DBUS
  1584.         OR.B    DBUS,REGST
  1585.         JMP     (REGEMUL)
  1586.  
  1587.   opC5: CLR.W   REGEA                     /* CMP zp */
  1588.         MOVE.B  (REGMPC)+,REGEA
  1589.         MOVE.L  REGEA,REGMEA
  1590.         MOVE.B  (REGMEA),DBUS
  1591.         SUB.B   REGA,DBUS
  1592.         BEQ     opC52
  1593.         MOVE.W  SR,DBUS
  1594.         AND.B   #(BITN|BITZ|BITX),DBUS
  1595.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1596.         AND.B   #~(BITN|BITZ|BITX),REGST
  1597.         OR.B    DBUS,REGST
  1598.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1599.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1600.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1601.         OR.B    DBUS,REGST      /* carry flag must be set */
  1602.         JMP     (REGEMUL)
  1603.    opC52:
  1604.         MOVE.W  SR,DBUS
  1605.         AND.B   #(BITN|BITZ|BITX),DBUS
  1606.         AND.B   #~(BITN|BITZ|BITX),REGST
  1607.         OR.B    DBUS,REGST
  1608.         ADD.B   DBUS,DBUS
  1609.         ADD.B   DBUS,DBUS
  1610.         AND.B   #(BITX),DBUS
  1611.         OR.B    DBUS,REGST
  1612.         JMP     (REGEMUL)
  1613.  
  1614.   opC6: CLR.W   REGEA                   /* DEC zp */
  1615.         MOVE.B  (REGMPC)+,REGEA
  1616.         BRA     doDEC
  1617.  
  1618.   opC7: JMP     (REGEMUL)
  1619.  
  1620.   opC8: ADDQ.B  #1,REGY           /* INY */
  1621.         MOVE.W  SR,DBUS
  1622.         AND.B   #(BITN|BITZ),DBUS
  1623.         AND.B   #~(BITN|BITZ),REGST
  1624.         OR.B    DBUS,REGST
  1625.         JMP     (REGEMUL)
  1626.  
  1627.   opC9:                                  /* CMP # */
  1628.         MOVE.B  (REGMPC)+,DBUS
  1629.         SUB.B   REGA,DBUS
  1630.         BEQ     opC92
  1631.         MOVE.W  SR,DBUS
  1632.         AND.B   #(BITN|BITZ|BITX),DBUS
  1633.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1634.         AND.B   #~(BITN|BITZ|BITX),REGST
  1635.         OR.B    DBUS,REGST
  1636.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1637.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1638.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1639.         OR.B    DBUS,REGST      /* carry flag must be set */
  1640.         JMP     (REGEMUL)
  1641.   opC92:
  1642.         MOVE.W  SR,DBUS
  1643.         AND.B   #(BITN|BITZ|BITX),DBUS
  1644.         AND.B   #~(BITN|BITZ|BITX),REGST
  1645.         OR.B    DBUS,REGST
  1646.         ADD.B   DBUS,DBUS
  1647.         ADD.B   DBUS,DBUS
  1648.         AND.B   #(BITX),DBUS
  1649.         OR.B    DBUS,REGST
  1650.         JMP     (REGEMUL)
  1651.  
  1652.   opCA: SUBQ.B  #1,REGX              /* DEX */
  1653.         MOVE.W  SR,DBUS
  1654.         AND.B   #(BITN|BITZ),DBUS
  1655.         AND.B   #~(BITN|BITZ),REGST
  1656.         OR.B    DBUS,REGST
  1657.         JMP     (REGEMUL)
  1658.  
  1659.   opCB: JMP     (REGEMUL)
  1660.  
  1661.   opCC:                                   /* CPY abs */
  1662.         MOVE.B  1(REGMPC),-(SP)
  1663.         MOVE.W  (SP)+,REGEA
  1664.         MOVE.B  (REGMPC),REGEA
  1665.         ADDQ.W  #2,REGMPC
  1666.         MOVE.L  REGEA,REGMEA
  1667.         MOVE.B  (REGMEA),DBUS
  1668.         SUB.B   REGY,DBUS
  1669.         BEQ     opCC2
  1670.         MOVE.W  SR,DBUS
  1671.         AND.B   #(BITN|BITZ|BITX),DBUS
  1672.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1673.         AND.B   #~(BITN|BITZ|BITX),REGST
  1674.         OR.B    DBUS,REGST
  1675.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1676.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1677.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1678.         OR.B    DBUS,REGST      /* carry flag must be set */
  1679.         JMP     (REGEMUL)
  1680.   opCC2:
  1681.         MOVE.W  SR,DBUS
  1682.         AND.B   #(BITN|BITZ|BITX),DBUS
  1683.         AND.B   #~(BITN|BITZ|BITX),REGST
  1684.         OR.B    DBUS,REGST
  1685.         ADD.B   DBUS,DBUS
  1686.         ADD.B   DBUS,DBUS
  1687.         AND.B   #(BITX),DBUS
  1688.         OR.B    DBUS,REGST
  1689.         JMP     (REGEMUL)
  1690.  
  1691.   opCD:                                   /* CMP abs */
  1692.         MOVE.B  1(REGMPC),-(SP)
  1693.         MOVE.W  (SP)+,REGEA
  1694.         MOVE.B  (REGMPC),REGEA
  1695.         ADDQ.W  #2,REGMPC
  1696.         MOVE.L  REGEA,REGMEA
  1697.         MOVE.B  (REGMEA),DBUS
  1698.         SUB.B   REGA,DBUS
  1699.         BEQ     opCD2
  1700.         MOVE.W  SR,DBUS
  1701.         AND.B   #(BITN|BITZ|BITX),DBUS
  1702.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1703.         AND.B   #~(BITN|BITZ|BITX),REGST
  1704.         OR.B    DBUS,REGST
  1705.         ADD.B   DBUS,DBUS
  1706.         ADD.B   DBUS,DBUS
  1707.         AND.B   #(BITX),DBUS
  1708.         OR.B    DBUS,REGST
  1709.         JMP     (REGEMUL)
  1710.   opCD2:
  1711.         MOVE.W  SR,DBUS
  1712.         AND.B   #(BITN|BITZ|BITX),DBUS
  1713.         AND.B   #~(BITN|BITZ|BITX),REGST
  1714.         OR.B    DBUS,REGST
  1715.         ADD.B   DBUS,DBUS
  1716.         ADD.B   DBUS,DBUS
  1717.         AND.B   #(BITX),DBUS
  1718.         OR.B    DBUS,REGST
  1719.         JMP     (REGEMUL)
  1720.  
  1721.   opCE:                                   /* DEC abs */
  1722.         MOVE.B  1(REGMPC),-(SP)
  1723.         MOVE.W  (SP)+,REGEA
  1724.         MOVE.B  (REGMPC),REGEA
  1725.         ADDQ.W  #2,REGMPC
  1726.         BRA     doDEC
  1727.  
  1728.   opCF: JMP     (REGEMUL)
  1729.  
  1730.   opD0: BTST    #2,REGST     /* BNE */
  1731.         BNE     nobne        /* BITZ = 0x04 = bit #2 */
  1732.         MOVE.B  (REGMPC)+,DBUS
  1733.         EXT.W   DBUS
  1734.         ADDA.W  DBUS,REGMPC
  1735.         JMP     (REGEMUL)
  1736.     nobne:
  1737.         ADDQ.L  #1,REGMPC
  1738.         JMP     (REGEMUL)
  1739.  
  1740.   opD1: CLR.W   REGEA                     /* CMP (zp),Y */
  1741.         MOVE.B  (REGMPC)+,REGEA
  1742.         MOVE.L  REGEA,REGMEA
  1743.         MOVE.B  1(REGMEA),-(SP)
  1744.         MOVE.W  (SP)+,REGEA
  1745.         MOVE.B  (REGMEA),REGEA
  1746.         ADD.W   REGY,REGEA
  1747.         MOVE.L  REGEA,REGMEA
  1748.         MOVE.B  (REGMEA),DBUS
  1749.         SUB.B   REGA,DBUS
  1750.         BEQ     opD12
  1751.         MOVE.W  SR,DBUS
  1752.         AND.B   #(BITN|BITZ|BITX),DBUS
  1753.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1754.         AND.B   #~(BITN|BITZ|BITX),REGST
  1755.         OR.B    DBUS,REGST
  1756.         ADD.B   DBUS,DBUS
  1757.         ADD.B   DBUS,DBUS
  1758.         AND.B   #(BITX),DBUS
  1759.         OR.B    DBUS,REGST
  1760.         JMP     (REGEMUL)
  1761.   opD12:
  1762.         MOVE.W  SR,DBUS
  1763.         AND.B   #(BITN|BITZ|BITX),DBUS
  1764.         AND.B   #~(BITN|BITZ|BITX),REGST
  1765.         OR.B    DBUS,REGST
  1766.         ADD.B   DBUS,DBUS
  1767.         ADD.B   DBUS,DBUS
  1768.         AND.B   #(BITX),DBUS
  1769.         OR.B    DBUS,REGST
  1770.         JMP     (REGEMUL)
  1771.  
  1772.   opD2: JMP     (REGEMUL)
  1773.  
  1774.   opD3: JMP     (REGEMUL)
  1775.  
  1776.   opD4: JMP     (REGEMUL)
  1777.  
  1778.   opD5: CLR.W   REGEA                     /* CMP zp,X */
  1779.         MOVE.B  (REGMPC)+,REGEA
  1780.         ADD.B   REGX,REGEA
  1781.         MOVE.L  REGEA,REGMEA
  1782.         MOVE.B  (REGMEA),DBUS
  1783.         SUB.B   REGA,DBUS
  1784.         BEQ     opD52
  1785.         MOVE.W  SR,DBUS
  1786.         AND.B   #(BITN|BITZ|BITX),DBUS
  1787.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1788.         AND.B   #~(BITN|BITZ|BITX),REGST
  1789.         OR.B    DBUS,REGST
  1790.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1791.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1792.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1793.         OR.B    DBUS,REGST      /* carry flag must be set */
  1794.         JMP     (REGEMUL)
  1795.   opD52:
  1796.         MOVE.W  SR,DBUS
  1797.         AND.B   #(BITN|BITZ|BITX),DBUS
  1798.         AND.B   #~(BITN|BITZ|BITX),REGST
  1799.         OR.B    DBUS,REGST
  1800.         ADD.B   DBUS,DBUS
  1801.         ADD.B   DBUS,DBUS
  1802.         AND.B   #(BITX),DBUS
  1803.         OR.B    DBUS,REGST
  1804.         JMP     (REGEMUL)
  1805.  
  1806.   opD6: CLR.W   REGEA                     /* DEC zp,X */
  1807.         MOVE.B  (REGMPC)+,REGEA
  1808.         ADD.B   REGX,REGEA
  1809.         BRA     doDEC
  1810.  
  1811.   opD7: JMP     (REGEMUL)
  1812.  
  1813.   opD8: ANDI.B  #~BITD,REGST      /* CLD */
  1814.         JMP     (REGEMUL)
  1815.  
  1816.   opD9:                                   /* CMP abs,Y */
  1817.         MOVE.B  1(REGMPC),-(SP)
  1818.         MOVE.W  (SP)+,REGEA
  1819.         MOVE.B  (REGMPC),REGEA
  1820.         ADD.W   REGY,REGEA
  1821.         ADDQ.W  #2,REGMPC
  1822.         MOVE.L  REGEA,REGMEA
  1823.         MOVE.B  (REGMEA),DBUS
  1824.         SUB.B   REGA,DBUS
  1825.         BEQ     opD92
  1826.         MOVE.W  SR,DBUS
  1827.         AND.B   #(BITN|BITZ|BITX),DBUS
  1828.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1829.         AND.B   #~(BITN|BITZ|BITX),REGST
  1830.         OR.B    DBUS,REGST
  1831.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1832.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1833.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1834.         OR.B    DBUS,REGST      /* carry flag must be set */
  1835.         JMP     (REGEMUL)
  1836.   opD92:
  1837.         MOVE.W  SR,DBUS
  1838.         AND.B   #(BITN|BITZ|BITX),DBUS
  1839.         AND.B   #~(BITN|BITZ|BITX),REGST
  1840.         OR.B    DBUS,REGST
  1841.         ADD.B   DBUS,DBUS
  1842.         ADD.B   DBUS,DBUS
  1843.         AND.B   #(BITX),DBUS
  1844.         OR.B    DBUS,REGST
  1845.         JMP     (REGEMUL)
  1846.  
  1847.   opDA: JMP     (REGEMUL)
  1848.  
  1849.   opDB: JMP     (REGEMUL)
  1850.  
  1851.   opDC: JMP     (REGEMUL)
  1852.  
  1853.   opDD:                                   /* CMP abs,X */
  1854.         MOVE.B  1(REGMPC),-(SP)
  1855.         MOVE.W  (SP)+,REGEA
  1856.         MOVE.B  (REGMPC),REGEA
  1857.         ADD.W   REGX,REGEA
  1858.         ADDQ.W  #2,REGMPC
  1859.         MOVE.L  REGEA,REGMEA
  1860.         MOVE.B  (REGMEA),DBUS
  1861.         SUB.B   REGA,DBUS
  1862.         BEQ     opDD2
  1863.         MOVE.W  SR,DBUS
  1864.         AND.B   #(BITN|BITZ|BITX),DBUS
  1865.         EORI.B  #BITN,DBUS
  1866.         AND.B   #~(BITN|BITZ|BITX),REGST
  1867.         OR.B    DBUS,REGST
  1868.         ADD.B   DBUS,DBUS
  1869.         ADD.B   DBUS,DBUS
  1870.         AND.B   #(BITX),DBUS
  1871.         OR.B    DBUS,REGST
  1872.         JMP     (REGEMUL)
  1873.   opDD2:
  1874.         MOVE.W  SR,DBUS
  1875.         AND.B   #(BITN|BITZ|BITX),DBUS
  1876.         AND.B   #~(BITN|BITZ|BITX),REGST
  1877.         OR.B    DBUS,REGST
  1878.         ADD.B   DBUS,DBUS
  1879.         ADD.B   DBUS,DBUS
  1880.         AND.B   #(BITX),DBUS
  1881.         OR.B    DBUS,REGST
  1882.         JMP     (REGEMUL)
  1883.  
  1884.   opDE:                                   /* DEC abs,X */
  1885.         MOVE.B  1(REGMPC),-(SP)       /* get hi byte */
  1886.         MOVE.W  (SP)+,REGEA           /* and shift by 8 */
  1887.         MOVE.B  (REGMPC),REGEA            /* get lo byte */
  1888.         ADD.W   REGX,REGEA
  1889.         ADDQ.W  #2,REGMPC
  1890.         BRA     doDEC
  1891.  
  1892.   opDF: JMP     (REGEMUL)
  1893.  
  1894.   opE0:                                  /* CPX # */
  1895.         MOVE.B  (REGMPC)+,DBUS
  1896.         SUB.B   REGX,DBUS
  1897.         BEQ     opE02
  1898.         MOVE.W  SR,DBUS
  1899.         AND.B   #(BITN|BITZ|BITX),DBUS
  1900.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1901.         AND.B   #~(BITN|BITZ|BITX),REGST
  1902.         OR.B    DBUS,REGST
  1903.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1904.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1905.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1906.         OR.B    DBUS,REGST      /* carry flag must be set */
  1907.         JMP     (REGEMUL)
  1908.   opE02:
  1909.         MOVE.W  SR,DBUS
  1910.         AND.B   #(BITN|BITZ|BITX),DBUS
  1911.         AND.B   #~(BITN|BITZ|BITX),REGST
  1912.         OR.B    DBUS,REGST
  1913.         ADD.B   DBUS,DBUS
  1914.         ADD.B   DBUS,DBUS
  1915.         AND.B   #(BITX),DBUS
  1916.         OR.B    DBUS,REGST
  1917.         JMP     (REGEMUL)
  1918.  
  1919.   opE1: CLR.W   REGEA                     /* SBC (zp,X) */
  1920.         MOVE.B  (REGMPC)+,REGEA
  1921.         ADD.B   REGX,REGEA
  1922.         MOVE.L  REGEA,REGMEA
  1923.         MOVE.B  1(REGMEA),-(SP)
  1924.         MOVE.W  (SP)+,REGEA
  1925.         MOVE.B  (REGMEA),REGEA
  1926.         BRA     doSBC
  1927.  
  1928.   opE2: JMP     (REGEMUL)
  1929.  
  1930.   opE3: JMP     (REGEMUL)
  1931.  
  1932.   opE4: CLR.W   REGEA                     /* CPX zp */
  1933.         MOVE.B  (REGMPC)+,REGEA
  1934.         MOVE.L  REGEA,REGMEA
  1935.         MOVE.B  (REGMEA),DBUS
  1936.         SUB.B   REGX,DBUS
  1937.         BEQ     opE42
  1938.         MOVE.W  SR,DBUS
  1939.         AND.B   #(BITN|BITZ|BITX),DBUS
  1940.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  1941.         AND.B   #~(BITN|BITZ|BITX),REGST
  1942.         OR.B    DBUS,REGST
  1943.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1944.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  1945.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  1946.         OR.B    DBUS,REGST      /* carry flag must be set */
  1947.         JMP     (REGEMUL)
  1948.    opE42:
  1949.         MOVE.W  SR,DBUS
  1950.         AND.B   #(BITN|BITZ|BITX),DBUS
  1951.         AND.B   #~(BITN|BITZ|BITX),REGST
  1952.         OR.B    DBUS,REGST
  1953.         ADD.B   DBUS,DBUS
  1954.         ADD.B   DBUS,DBUS
  1955.         AND.B   #(BITX),DBUS
  1956.         OR.B    DBUS,REGST
  1957.         JMP     (REGEMUL)
  1958.  
  1959.   opE5: CLR.W   REGEA                     /* SBC zp */
  1960.         MOVE.B  (REGMPC)+,REGEA
  1961.         BRA     doSBC
  1962.  
  1963.   opE6: CLR.W   REGEA                     /* INC zp */
  1964.         MOVE.B  (REGMPC)+,REGEA
  1965.         BRA     doINC
  1966.  
  1967.   opE7: JMP     (REGEMUL)
  1968.  
  1969.   opE8: ADDQ.B  #1,REGX           /* INX */
  1970.         MOVE.W  SR,DBUS
  1971.         AND.B   #(BITN|BITZ),DBUS
  1972.         AND.B   #~(BITN|BITZ),REGST
  1973.         OR.B    DBUS,REGST
  1974.         JMP     (REGEMUL)
  1975.  
  1976.   opE9:                                  /* SBC # */
  1977.         MOVE.B  (REGMPC)+,DBUS
  1978.         EORI.B  #BITX,REGST
  1979.         ORI.B   #BITZ,REGST    /* SUBX doesn't set Z flag */
  1980.         MOVE.B  REGST,CCR
  1981.         SUBX.B  DBUS,REGA
  1982.         MOVE.W  SR,DBUS
  1983.         AND.B   #(BITN|BITZ|BITX|BITV),DBUS
  1984.         EORI.B  #BITX,DBUS
  1985.         AND.B   #~(BITN|BITZ|BITX|BITV),REGST
  1986.         OR.B    DBUS,REGST
  1987.         JMP     (REGEMUL)
  1988.  
  1989.   opEA: JMP     (REGEMUL)
  1990.  
  1991.   opEB: JMP     (REGEMUL)
  1992.  
  1993.   opEC:                                   /* CPX abs */
  1994.         MOVE.B  1(REGMPC),-(SP)
  1995.         MOVE.W  (SP)+,REGEA
  1996.         MOVE.B  (REGMPC),REGEA
  1997.         ADDQ.W  #2,REGMPC
  1998.         MOVE.L  REGEA,REGMEA
  1999.         MOVE.B  (REGMEA),DBUS
  2000.         SUB.B   REGX,DBUS
  2001.         BEQ     opEC2
  2002.         MOVE.W  SR,DBUS
  2003.         AND.B   #(BITN|BITZ|BITX),DBUS
  2004.         EORI.B  #BITN,DBUS                 /* why?? why?? */
  2005.         AND.B   #~(BITN|BITZ|BITX),REGST
  2006.         OR.B    DBUS,REGST
  2007.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  2008.         ADD.B   DBUS,DBUS       /* Shift BITZ into BITX */
  2009.         AND.B   #(BITX),DBUS    /* if result of compare was zero */
  2010.         OR.B    DBUS,REGST      /* carry flag must be set */
  2011.         JMP     (REGEMUL)
  2012.   opEC2:
  2013.         MOVE.W  SR,DBUS
  2014.         AND.B   #(BITN|BITZ|BITX),DBUS
  2015.         AND.B   #~(BITN|BITZ|BITX),REGST
  2016.         OR.B    DBUS,REGST
  2017.         ADD.B   DBUS,DBUS
  2018.         ADD.B   DBUS,DBUS
  2019.         AND.B   #(BITX),DBUS
  2020.         OR.B    DBUS,REGST
  2021.         JMP     (REGEMUL)
  2022.  
  2023.   opED:                                   /* SBC abs */
  2024.         MOVE.B  1(REGMPC),-(SP)
  2025.         MOVE.W  (SP)+,REGEA
  2026.         MOVE.B  (REGMPC),REGEA
  2027.         ADDQ.W  #2,REGMPC
  2028.         BRA     doSBC
  2029.  
  2030.   opEE:                                   /* INC abs */
  2031.         MOVE.B  1(REGMPC),-(SP)
  2032.         MOVE.W  (SP)+,REGEA
  2033.         MOVE.B  (REGMPC),REGEA
  2034.         ADDQ.W  #2,REGMPC
  2035.         BRA     doINC
  2036.  
  2037.   opEF: JMP     (REGEMUL)
  2038.  
  2039.   opF0: BTST    #2,REGST     /* BEQ */
  2040.         BEQ     nobeq        /* BITZ = 0x04 = bit #2 */
  2041.         MOVE.B  (REGMPC)+,DBUS
  2042.         EXT.W   DBUS
  2043.         ADDA.W  DBUS,REGMPC
  2044.         JMP     (REGEMUL)
  2045.     nobeq:
  2046.         ADDQ.L  #1,REGMPC
  2047.         JMP     (REGEMUL)
  2048.  
  2049.   opF1: CLR.W   REGEA                     /* SBC (zp),Y */
  2050.         MOVE.B  (REGMPC)+,REGEA
  2051.         MOVE.L  REGEA,REGMEA
  2052.         MOVE.B  1(REGMEA),-(SP)
  2053.         MOVE.W  (SP)+,REGEA
  2054.         MOVE.B  (REGMEA),REGEA
  2055.         ADD.W   REGY,REGEA
  2056.         BRA     doSBC
  2057.  
  2058.   opF2: JMP     (REGEMUL)
  2059.  
  2060.   opF3: JMP     (REGEMUL)
  2061.  
  2062.   opF4: JMP     (REGEMUL)
  2063.  
  2064.   opF5: CLR.W   REGEA                     /* SBC zp,X */
  2065.         MOVE.B  (REGMPC)+,REGEA
  2066.         ADD.B   REGX,REGEA
  2067.         BRA     doSBC
  2068.  
  2069.   opF6: CLR.W   REGEA                     /* INC zp,X */
  2070.         MOVE.B  (REGMPC)+,REGEA
  2071.         ADD.B   REGX,REGEA
  2072.         BRA     doINC
  2073.  
  2074.   opF7: JMP     (REGEMUL)
  2075.  
  2076.   opF8: ORI.B   #BITD,REGST               /* SED */
  2077.         JMP     (REGEMUL)
  2078.  
  2079.   opF9:                                   /* SBC abs,Y */
  2080.         MOVE.B  1(REGMPC),-(SP)
  2081.         MOVE.W  (SP)+,REGEA
  2082.         MOVE.B  (REGMPC),REGEA
  2083.         ADD.W   REGY,REGEA
  2084.         ADDQ.W  #2,REGMPC
  2085.         BRA     doSBC
  2086.  
  2087.   opFA: JMP     (REGEMUL)
  2088.  
  2089.   opFB: JMP     (REGEMUL)
  2090.  
  2091.   opFC: JMP     (REGEMUL)
  2092.  
  2093.   opFD:                                   /* SBC abs,X */
  2094.         MOVE.B  1(REGMPC),-(SP)
  2095.         MOVE.W  (SP)+,REGEA
  2096.         MOVE.B  (REGMPC),REGEA
  2097.         ADD.W   REGX,REGEA
  2098.         ADDQ.W  #2,REGMPC
  2099.         BRA     doSBC
  2100.  
  2101.   opFE:                                   /* INC abs,X */
  2102.         MOVE.B  1(REGMPC),-(SP)
  2103.         MOVE.W  (SP)+,REGEA
  2104.         MOVE.B  (REGMPC),REGEA
  2105.         ADD.W   REGX,REGEA
  2106.         ADDQ.W  #2,REGMPC
  2107.         BRA     doINC
  2108.  
  2109.   opFF: JMP     (REGEMUL)
  2110.  
  2111.   }
  2112.  
  2113. }
  2114.  
  2115.